package api

import (
	"fmt"

	"gitee.com/cloudapex/ulern/util"
	"google.golang.org/genproto/googleapis/rpc/errdetails"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
)

/*******************************************************************************
Copyright:cloud
Author:cloudapex@126.com
Version:1.0
Date:2020-09-25
Description: 公共定义
*******************************************************************************/

// 错误码定义
const (
	ECode_Begin     codes.Code = iota + 20 // 起始错误码
	ECode_DBErr                            // 数据库错误
	ECode_NotFound                         // 记录找不到
	ECode_ParamsErr                        // 参数错误
	ECode_Convert                          // 结构转换错误
	ECode_Logic                            // 功能逻辑错误
	ECode_Cache                            // 功能缓存错误
)

// grpc 错误状态码封装(base)
func Error(code codes.Code, msg string, err ...error) error {
	s := status.New(code, msg)
	if len(err) == 0 || err[0] == nil {
		return s.Err()
	}
	sd, err_ := s.WithDetails(&errdetails.DebugInfo{Detail: fmt.Sprintf("%v", err)})
	if err_ != nil {
		return s.Err()
	}
	return sd.Err()
}

// grpc 数据库错误
func DBError(msg string, err ...error) error {
	util.Cast(msg == "", func() { msg = "数据库错误" }, nil)
	return Error(ECode_DBErr, msg, err...)
}

// grpc 缓存库错误
func RDBError(msg string, err ...error) error {
	util.Cast(msg == "", func() { msg = "缓存库错误" }, nil)
	return Error(ECode_Cache, msg, err...)
}

// grpc 查找错误
func FoundError(msg string, err ...error) error {
	util.Cast(msg == "", func() { msg = "记录找不到" }, nil)
	return Error(ECode_NotFound, msg, err...)
}

// grpc 结构转换错误
func ConvertError(msg string, err ...error) error {
	util.Cast(msg == "", func() { msg = "结构转换失败" }, nil)
	return Error(ECode_Convert, msg, err...)
}
